命令模式 (Command Pattern):
組成:
適用時機:
// Command Interface
class Command {
public:
virtual void execute() = 0;
};
// Receiver: 廚師
class Chef {
public:
void cookBurger() {
std::cout << "製作漢堡" << std::endl;
}
void cookPizza() {
std::cout << "製作披薩" << std::endl;
}
void cookSalad() {
std::cout << "製作沙拉" << std::endl;
}
};
// ConcreteCommand: 漢堡
class BurgerCommand : public Command {
private:
Chef* chef;
public:
BurgerCommand(Chef* c) : chef(c) {}
void execute() override {
chef->cookBurger();
}
};
// ConcreteCommand: 披薩
class PizzaCommand : public Command {
private:
Chef* chef;
public:
PizzaCommand(Chef* c) : chef(c) {}
void execute() override {
chef->cookPizza();
}
};
// ConcreteCommand: 沙拉
class SaladCommand : public Command {
private:
Chef* chef;
public:
SaladCommand(Chef* c) : chef(c) {}
void execute() override {
chef->cookSalad();
}
};
// Invoker: 服務員
class Waiter {
private:
std::vector<Command*> orders;
public:
void takeOrder(Command* order) {
orders.push_back(order);
}
void placeOrders() {
for (auto order: orders) {
order->execute();
}
orders.clear();
}
};
// Client
int main() {
Chef chef; // Receiver
// Client 創建命令並設定它的接收者
BurgerCommand burger(&chef);
PizzaCommand pizza(&chef);
SaladCommand salad(&chef);
// 服務員收到顧客的命令
Waiter waiter; // Invoker
waiter.takeOrder(&burger);
waiter.takeOrder(&pizza);
waiter.takeOrder(&salad);
// 服務員將命令發送給廚師
waiter.placeOrders();
}
Macro 錄製: 用戶可以錄製一系列的動作,然後將這些動作保存為一個單一的 Macro Command,以後可以隨時重播這些動作
Batch 執行: 當需要執行一系列的命令時,如資料庫的批量操作或文件操作
這種模式的優點是增強了系統的靈活性,使得命令的執行更加動態和組合性。但同時也可能帶來更多的複雜性,尤其是當命令間有相互依賴時
NoCommand:
class NoCommand : public Command {
public:
void execute() override {
// 什麼都不做
}
};
int main() {
Chef chef; // Receiver
// Client 創建命令並設定它的接收者
NoCommand noCmd;
// 服務員收到顧客的命令
Waiter waiter; // Invoker
waiter.takeOrder(&noCmd); // 此命令不會產生任何行為
// 服務員將命令發送給廚師
waiter.placeOrders();
}
[1]. https://refactoring.guru/design-patterns/command
[2]. https://ithelp.ithome.com.tw/articles/10204425
[3]. https://notfalse.net/4/command-pattern